package utils

import (
	"database/sql"
	"fmt"
	"gin-epg/internal/app/dao" // 导入 dao 包
	"gin-epg/internal/app/entity"
	"github.com/jinzhu/gorm"
	"time"
)

func HandleCrossDayRecord(db *gorm.DB, startTime, endTime time.Time, title, desc, channel, source string) error {
	// 获取第一天的结束时间
	endOfDay := time.Date(startTime.Year(), startTime.Month(), startTime.Day(), 23, 59, 0, 0, startTime.Location())

	if endTime.After(endOfDay) {
		// 跨天情况，分割成两条记录
		firstDayRecord := entity.EpgProgramCollect{
			Title:      title,
			Desc:       desc,
			Source:     source,
			Channel:    channel,
			Date:       entity.NullDate{sql.NullTime{Time: startTime, Valid: true}},
			Start:      startTime.Format("15:04"),
			End:        "23:59",
			CreateTime: entity.NullTime{sql.NullTime{Time: time.Now(), Valid: true}},
		}
		secondDayRecord := entity.EpgProgramCollect{
			Title:      title,
			Desc:       desc,
			Source:     source,
			Channel:    channel,
			Date:       entity.NullDate{sql.NullTime{Time: endTime, Valid: true}},
			Start:      "00:00",
			End:        endTime.Format("15:04"),
			CreateTime: entity.NullTime{sql.NullTime{Time: time.Now(), Valid: true}},
		}

		// 如果第一条开始时间为23:59 忽略第一条处理
		if firstDayRecord.Start != "23:59" {
			// 插入第一条记录
			if err := insertOrUpdateRecord(db, firstDayRecord); err != nil {
				dao.Logger.Errorf("failed to insert or update first day record: %v", err) // 使用 dao.Logger 记录错误
				return fmt.Errorf("failed to insert or update first day record: %v", err)
			}
		}

		// 如果第二条结束时间不为00:00 忽略第二条处理
		if secondDayRecord.End != "00:00" {
			// 插入第二条记录
			if err := insertOrUpdateRecord(db, secondDayRecord); err != nil {
				dao.Logger.Errorf("failed to insert or update second day record: %v", err) // 使用 dao.Logger 记录错误
				return fmt.Errorf("failed to insert or update second day record: %v", err)
			}
		}

	} else {
		// 不跨天，直接插入或更新
		record := entity.EpgProgramCollect{
			Title:      title,
			Desc:       desc,
			Source:     source,
			Channel:    channel,
			Date:       entity.NullDate{sql.NullTime{Time: startTime, Valid: true}},
			Start:      startTime.Format("15:04"),
			End:        endTime.Format("15:04"),
			CreateTime: entity.NullTime{sql.NullTime{Time: time.Now(), Valid: true}},
		}

		if err := insertOrUpdateRecord(db, record); err != nil {
			dao.Logger.Errorf("failed to insert or update record: %v", err) // 使用 dao.Logger 记录错误
			return fmt.Errorf("failed to insert or update record: %v", err)
		}
	}

	return nil
}

func insertOrUpdateRecord(db *gorm.DB, record entity.EpgProgramCollect) error {
	var existingRecord entity.EpgProgramCollect
	if err := db.Where(&entity.EpgProgramCollect{Channel: record.Channel, Date: record.Date, Start: record.Start, Source: record.Source}).First(&existingRecord).Error; err == nil {
		dao.Logger.Debugf("update success %v", existingRecord) // 使用 dao.Logger 记录信息
		if existingRecord.Title != record.Title || existingRecord.Desc != record.Desc {
			dao.Logger.Debugf("title or desc changed, updating...") // 使用 dao.Logger 记录信息
			if err := db.Model(&existingRecord).Updates(entity.EpgProgramCollect{Title: record.Title, Desc: record.Desc, UpdateTime: entity.NullTime{sql.NullTime{Time: time.Now(), Valid: true}}}).Error; err != nil {
				dao.Logger.Errorf("update error: %v", err) // 使用 dao.Logger 记录错误
				return err
			}
			dao.Logger.Debugf("update success: %v", existingRecord) // 使用 dao.Logger 记录信息
		}
	} else {
		dao.Logger.Debugf("insert new record") // 使用 dao.Logger 记录信息
		if err := db.Create(&record).Error; err != nil {
			dao.Logger.Errorf("insert error: %v", err) // 使用 dao.Logger 记录错误
			return err
		} else {
			dao.Logger.Debugf("insert success: %v", record) // 使用 dao.Logger 记录信息
		}
	}
	return nil
}
